File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Collections\SimpleMutableIntervalTree`2.cs
Web Access
Project: src\src\CodeStyle\Core\Analyzers\Microsoft.CodeAnalysis.CodeStyle.csproj (Microsoft.CodeAnalysis.CodeStyle)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using System.Collections.Immutable;
 
namespace Microsoft.CodeAnalysis.Shared.Collections;
 
internal class SimpleMutableIntervalTree<T, TIntrospector> : MutableIntervalTree<T>
    where TIntrospector : struct, IIntervalIntrospector<T>
{
    private readonly TIntrospector _introspector;
 
    public SimpleMutableIntervalTree(in TIntrospector introspector, IEnumerable<T>? values)
    {
        _introspector = introspector;
 
        if (values != null)
        {
            foreach (var value in values)
            {
                root = Insert(root, new Node(value), introspector);
            }
        }
    }
 
    protected ref readonly TIntrospector Introspector => ref _introspector;
 
    /// <summary>
    /// Warning.  Mutates the tree in place.
    /// </summary>
    /// <param name="value"></param>
    public void AddIntervalInPlace(T value)
    {
        var newNode = new Node(value);
        this.root = Insert(root, newNode, in Introspector);
    }
 
    public ImmutableArray<T> GetIntervalsThatOverlapWith(int start, int length)
        => this.Algorithms.GetIntervalsThatOverlapWith(start, length, in _introspector);
 
    public ImmutableArray<T> GetIntervalsThatIntersectWith(int start, int length)
        => this.Algorithms.GetIntervalsThatIntersectWith(start, length, in _introspector);
 
    public ImmutableArray<T> GetIntervalsThatContain(int start, int length)
        => this.Algorithms.GetIntervalsThatContain(start, length, in _introspector);
 
    public void FillWithIntervalsThatOverlapWith(int start, int length, ref TemporaryArray<T> builder)
        => this.Algorithms.FillWithIntervalsThatOverlapWith(start, length, ref builder, in _introspector);
 
    public void FillWithIntervalsThatIntersectWith(int start, int length, ref TemporaryArray<T> builder)
        => this.Algorithms.FillWithIntervalsThatIntersectWith(start, length, ref builder, in _introspector);
 
    public void FillWithIntervalsThatContain(int start, int length, ref TemporaryArray<T> builder)
        => this.Algorithms.FillWithIntervalsThatContain(start, length, ref builder, in _introspector);
 
    public bool HasIntervalThatIntersectsWith(int position)
        => this.Algorithms.HasIntervalThatIntersectsWith(position, in _introspector);
 
    public bool HasIntervalThatOverlapsWith(int start, int length)
        => this.Algorithms.HasIntervalThatOverlapsWith(start, length, in _introspector);
 
    public bool HasIntervalThatIntersectsWith(int start, int length)
        => this.Algorithms.HasIntervalThatIntersectsWith(start, length, in _introspector);
 
    public bool HasIntervalThatContains(int start, int length)
        => this.Algorithms.HasIntervalThatContains(start, length, in _introspector);
 
    protected int MaxEndValue(Node node)
        => GetEnd(node.MaxEndNode.Value, in _introspector);
}